package com.bigdata.quality.config.converter;

import cn.hutool.core.util.StrUtil;

import java.util.Map;

public interface ColumnTypeConverter {

  /**
   * 获取到Flink的字段映射，可以写死 也可以获取数据库配置的
   */
  Map<String, String> toFlinkColumnTypeMap();


  /**
   * @param flinkColumnTypeMap 字段类型映射列表 比如  bigint unsigned zerofill -> decimal(10,2). 类型映射返回完整类型 type(长度或者精度)
   */
  default String convertColumnType(Map<String, String> flinkColumnTypeMap, String sourceColumnType) {
    String defaultType = "STRING";
    if (StrUtil.isBlank(sourceColumnType)) {
      return defaultType;
    }

    String destColumnType = flinkColumnTypeMap.get(sourceColumnType);
    if (StrUtil.isBlank(destColumnType)) {
      // 如果空是不是有( < [这种符号匹配
      sourceColumnType = getBeforeLessThan(sourceColumnType);
      destColumnType  = flinkColumnTypeMap.get(sourceColumnType);
      if (StrUtil.isNotBlank(destColumnType) && sourceColumnType.contains(destColumnType)) {
        return sourceColumnType;
      }

      return defaultType;
    }

    return destColumnType;
  }

  default String getBeforeLessThan(String input) {
    int index = 0;
    if(input.contains("<")){
      index = input.indexOf('<');
    }else if(input.contains("(")){
      index = input.indexOf('(');
    }else if(input.contains("[")){
      index = input.indexOf('[');
    }
    if (index != -1) {
      return input.substring(0, index);
    } else {
      return input;
    }
  }
}
